package com.finch.juc;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * @author Levi Wang
 * @create 2021-07-20 20:13
 *
 * 面向接口编程   多态的思想     为什么会出现Callable，新东西的出现一定是为了解决旧的方法无法解决的问题？   FutureTask的含义
 * 主线程遇到一个可能需要阻塞等待的资源/操作，那么就新开一个线程去处理它，处理完后返回一个值，这样主线程就可以继续去干其他的事情而不用阻塞了
 *
 *
 * 多线程中，第三种获得多线程的方式
 *
 * 1、get方法一般请放在最后一行，因为里面那个线程执行的一般是耗时的操作，所以要放在最后保证它能完成后再取返回值； 如果你提前去get的话，它还没有
 * 完成。那么就会导致主线程一直在那等，而不能往下执行，那么它的意义也就没有了
 *
 *
 *
 *
 * 实现Runable接口和实现Callable接口的区别
 * 1、方法不同，一个是run一个是call
 * 2、一个有异常，一个没有
 * 3、run没有返回值； call有返回值
 *
 *
 *
 * Callable  FutureTask  Runnable
 *
 *
 */


//class MyThread implements Runnable{
//    @Override
//    public void run() {
//
//    }
//}

    //泛型是什么类型就返回什么类型
class MyThread implements Callable<Integer> {

    @Override
    public Integer call() throws Exception {
        System.out.println("------here");
        return 1024;
    }
}



public class CallableDemo {

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        FutureTask futureTask = new FutureTask(new MyThread());

        new Thread(futureTask, "A").start(); //问：为什么这里可以传futureTask进去。diagram类图

        //如果下面这个线程也打开，但是只会调一次FutureTask
//        new Thread(futureTask, "B").start();

        System.out.println(futureTask.get());

    }

}





















